Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> array('a','b','c') => $arr['a']['b']['c'], niby proste ale mam chwilowy brak pomysłów
rogeros
post
Post #1





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 10.04.2002
Skąd: Pruszków

Ostrzeżenie: (10%)
X----


Witajcie.
Mam dynamiczną tablice która zawiera w sobie zmienna ilość wartości.
np:

$nazwa="voipsklep.pl";
$tablica=array('a','b','c','d','e','f');

i z tej tablicy chciałbym zrobić tablicę wielowymiarową tak
aby kolejny element tablicy $tablica był kolejnym "wymiarem" nowej tablic.
Nie wiem jak to fachowo nazwać. ale wynik chciałbym taki

$nowa_tablica=array("a"=>
array("b"=>
array("c"=>
......
array("f"=>$nazwa)

to było przedstawienie obrazowe. w skrócie chodzi mi o:
$nowa_tablica['a']['b']['c']['d']['e']['f']=$nazwa;


Próbowałem na różne sposoby ale niestety nie mam pomysłów na rozwiązanie tego problemu.
Za pomoc wszystkim z góry dziękuje.
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. <?php
  2. $nazwa='test';
  3. $tab=array('a','b','c','d','e','f');
  4. $newTab=array();
  5.  
  6. $lastTab=&$newTab;
  7. foreach($tab as $num=>$key)
  8. {
  9.    $lastTab[$key]=array();
  10.    $lastTab=&$lastTab[$key];
  11.    
  12.    if(($num+1)==count($tab)) $lastTab=$nazwa;
  13. }
  14. ?>

Ale czemu chcesz to zrobic tak?

Ten post edytował wookieb 30.01.2009, 14:19:00
Go to the top of the page
+Quote Post
rogeros
post
Post #3





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 10.04.2002
Skąd: Pruszków

Ostrzeżenie: (10%)
X----


Cytat(wookieb @ 30.01.2009, 13:58:07 ) *
Ale czemu chcesz to zrobic tak?


Dziękuje za pomoc. Już sprawdzam jak Twoje rozwiązanie działa.
Dlaczego tak robię.

Otóż muszę stworzyć plik xml z tablicy php. do tego mam odpowienią klasę i z tym nie ma problemu.
xml generuje drzewko katalogów (przy generowaniu nie wiemy ile będzie podkatalogów a w nich kolejnych podkatalagów a w nich [...])


i to własnie jest do generowania struktury podkatalogów.
Go to the top of the page
+Quote Post
siatkarzyna
post
Post #4





Grupa: Zarejestrowani
Postów: 85
Pomógł: 4
Dołączył: 1.07.2008

Ostrzeżenie: (0%)
-----


Można też tak jeśli o to chodzi

  1. <?php
  2. $nazwa="voipsklep.pl";
  3. $tablica = array('a','b','c','d','e','f');
  4.  
  5. $nr = count($tablica);
  6.  
  7. for ($i=0; $i<=$nr - 1; $i++) {
  8.  
  9. $nowa[$tablica[$i]] = $nazwa;
  10.  
  11. }
  12.  
  13.  
  14. echo "<pre>";
  15. print_r ($nowa);
  16. echo "</pre>";
  17. ?>
Go to the top of the page
+Quote Post
wookieb
post
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(rogeros @ 30.01.2009, 14:15:18 ) *
i to własnie jest do generowania struktury podkatalogów.


Aha to dobrze. Pytam bo wole wiedzieć czy to nie jest jakiś kolejny "genialny" pomysł programistyczny (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Mój przykład jest sprawdzony. Działa

Ten post edytował wookieb 30.01.2009, 14:18:38
Go to the top of the page
+Quote Post
rogeros
post
Post #6





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 10.04.2002
Skąd: Pruszków

Ostrzeżenie: (10%)
X----


nie jednak nie poradziłem sobie z problemem.
rozwiązanie kolegi wookieb jest bardzo dobrym rozwiązaniem
ale działa na referencjach i nie potrafię tego przystosować do swoich potrzeb.

ponieważ wyciągam kilka wpisów z bazy danych to tablice te mi mieszają uzywajac array_merge.

Otóż wygląda to tak:

mam takie wpisy w bazie danych:
Kod
id_kat     id_rodzic             nazwa
1               0                         telefony voip         
2               0|1                         linksysy     
3               0|1                         polycom          
4               0                         bramki voip     
5               0|4                         atcom          
6               0|4|5                     at1          
7               0|4|5|6                    Nowa kategoria     6     
8               0|4|5                     at2     
9               0|4                               d-link     
10               0                                  routery voip

wybaczcie za formatowanie tesktu. ale nie wiedziałem jak to tu wstawić ładnie

id_kat - to normalnie id danego katalogu
id_rodzic - jest to drzewko id_kat aby dojsc do danego podkatalogu

np: 0|4|5|6 - nowa kategoria 6
0 - katalog glowny.
4 - w katalogu glownym jest katalog bramki voip o id 4
5 - w katalogu bramki voip (4) znajduje sie katalog atcom o id 5
6 - w atcom znajduje sie at1 o id 6
-- i w tym katalogu jest nasz katalog "nowa kategoria 6" ktore ma id 7


i teraz muszę stworzyć z tego tablicę odwzorowującą katalogi

$tablica[0]="telefony voip";
$tablica[0][1]="linksys";
$tablica[0][2]='polycom';
$tablica[1]="bramki voip";
$tablica[1][1]="atcom";
$tablica[1][2][1]="at1";
$tablica[1][2][1][1]='nowa kategoria';


już nie wiem sam czy dobrze myślę.

Chciałbym zrobić te kategorie i ich hierarchię w jednej tablicy php.

Ten post edytował rogeros 30.01.2009, 15:20:19
Go to the top of the page
+Quote Post
wrzasq
post
Post #7





Grupa: Zarejestrowani
Postów: 206
Pomógł: 18
Dołączył: 6.03.2006
Skąd: Szczecin

Ostrzeżenie: (0%)
-----


jesli wychodzi ci cos takiego:

  1. <?php
  2. $tablica[0]="telefony voip";
  3. $tablica[0][1]="linksys";
  4. ?>


to na pewno zle myslisz (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) . musisz sobie w takim wypadku rozgraniczac na kazdym poziomie [0]['name'] i [0]['children'], [0]['children'][1]['name], [0]['children'][1]['children']...

ewentualnie mozesz sobie zrobic klase i przeciazyc metody interfejsu ArrayAccess aby wykrywac, czy zapisujesz cos glebiej, czy bezposrednio na danym poziomie.

a jakim problemem sa tutaj referencje? nie bardzo rozumiem jaki jest problem w tym, ze wookieb uzyl referencji - nawet jak ich nie rozumiesz, to tymbardziej - nie dotykaj i tyle. dal gotowe rozwiazanie.
Go to the top of the page
+Quote Post
rogeros
post
Post #8





Grupa: Zarejestrowani
Postów: 97
Pomógł: 0
Dołączył: 10.04.2002
Skąd: Pruszków

Ostrzeżenie: (10%)
X----


Udało mi się rozwiązać problem za wielką zasługą kolegi wookieb.
Bardzo mi pomógł. Chwała mu za to. Dzięki wookieb.

A oto rozwiązanie może się komuś przyda.

dane wejściowe z bazy danych

  1. INSERT INTO `katalogi` (`id_kat`, `id_rodzic`, `nazwa`) VALUES
  2. (1, '0', 'telefony voip'),
  3. (2, '0|1', 'linksys'),
  4. (3, '0|1', 'polycom'),
  5. (4, '0', 'bramki voip'),
  6. (5, '0|4', 'atcom'),
  7. (6, '0|4|5', 'at1'),
  8. (7, '0|4|5|6', 'Nowa kategoria'),
  9. (8, '0|4|5', 'at2'),
  10. (9, '0|4', 'd-link'),
  11. (10, '0', 'routery voip');



na początku wyciągamy dane z bazy i wrzucamy je do tablicy
  1. <?php
  2. $wynik=mysql_query(&#092;"select * from katalogi\");
  3. $ilosc_wynikow=mysql_num_rows($wynik);
  4. for($i=0;$i<$ilosc_wynikow;$i++){
  5.    $baza=mysql_fetch_assoc($wynik);
  6.    $temp=explode(&#092;"|\",$baza[id_rodzic]);
  7.    $dane[]=array(&#092;"id\"=>$baza[id_kat],\"parent\"=>array_pop($temp),\"name\"=>$baza[nazwa]);
  8.  
  9. }
  10. ?>



następnie z danych z bazy tworzymy tablicę z katalogami i podkatalogami za pomocą funkcji

  1. <?php
  2. function createTree(&$arr, $parent=0)
  3. {
  4.    $tree=array();
  5.    foreach($arr as $key=>$el)
  6.    {
  7.        if($el['parent']==$parent)
  8.        {
  9.            $el['childs']=createTree($arr, $el['id']);
  10.            if(count($el['childs'])==0) unset($arr[$key]);
  11.            $tree[]=$el;
  12.        }
  13.    }
  14.    return $tree;
  15. }
  16. ?>



dzięki tej funkcji otrzymujemy tablicę w postaci drzewka z z katalogami i podkatalogami (w podkatalogach kolejne podkatalogi a w nich kolejne itd)


teraz zostało nam z takiej tablicy utworzyć xml-a. do tego użyjemy kolejnej funkcji

  1. <?php
  2. function createXml($arr, $tabs=0)
  3. {
  4.    $str='';
  5.    foreach($arr as $el)
  6.    {
  7.        
  8.        $str.=str_repeat(&#092;"\t\", $tabs).''.\"\n\";
  9.        $str.=createXml($el['childs'], $tabs+1);
  10.        $str.=str_repeat(&#092;"\t\", $tabs).''.\"\n\";
  11.    }
  12.    return $str;
  13. }
  14. ?>


i dzięki temu otrzymujemy piękny gotowy plik xml

  1. <item name="telefony voip" id="1">
  2.      <item name="polycom" id="3">
  3.      </item>
  4.      <item name="linksys" id="2">
  5.      </item>
  6. </item>
  7. <item name="bramki voip" id="4">
  8.      <item name="d-link" id="9">
  9.      </item>
  10.      <item name="atcom" id="5">
  11.            <item name="at2" id="8">
  12.            </item>
  13.            <item name="at1" id="6">
  14.                  <item name="Nowa kategoria" id="7">
  15.                  </item>
  16.            </item>
  17.      </item>
  18. </item>
  19. <item name="routery voip" id="10">
  20. </item>



i to wszystko.

pozdrawiam i jeszcze raz dziękuje wookieb.



Do administratorów. Przez pomyłkę utworzyłem nowy post zamiast odpowiedzieć na swój własny. bardzo proszę scalić tego posta z tematem Temat: arrayand39aand39and39band39and39cand39__arrand39aand39and39band39and39cand39.


// zrobione
// ayeo



Ten post edytował ayeo 3.02.2009, 09:27:20
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 17:24